home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / Ant Movie Catalog 3.5.0.2 / amc_install.exe / {app} / Scripts / Monsieur Cinéma.ifs < prev    next >
Text File  |  2005-04-12  |  30KB  |  704 lines

  1. (***************************************************
  2.  
  3. Ant Movie Catalog importation script
  4. www.antp.be/software/moviecatalog/
  5.  
  6. [Infos]
  7. Authors=scorpion7552 (scripts originaux: Antoine Potten (MrCinΘma) et Danone-Kid (CinΘfil))
  8. Title=Monsieur CinΘma 
  9. Description=infos de MrCinΘma - mode normal/batch: voir l'onglet Commentaires
  10. Site=http://cinema.tiscali.fr
  11. Language=FR
  12. Version=5.2
  13. Requires=3.5.0
  14. Comments=mode batch: 2 modes possibles: d'aprΦs l'url mΘmorisΘe (MrCinΘma) ou d'aprΦs le nom du film + rΘalisateur (rΘsultats non garantis!)|N'oubliez pas de sauvegarder votre base actuelle avant de lancer le mode batch|Conseils: sΘlectionnez un nombre raisonnable de films et triez la liste des films par numΘros|α la fin de chaque mise α jour, un fichier log est crΘΘ (informations et erreurs - attention ce fichier est recrΘΘ α chaque lancement de ce script) 
  15. License=This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
  16. GetInfo=1
  17.  
  18. [Options]
  19. Image=1|1|0=aucune image|1=image MrCinΘma seule|2=image CinΘfil seule|3=toutes les images
  20. Histoire=0|0|0=rΘsumΘ (s'il existe, sinon histoire complΦte)|1=histoire complΦte
  21. Anecdote=0|0|0=pas d'anecdote|1=anecdote α la suite de l'avis de la rΘdaction (Commentaires)
  22. GΘnΘrique=0|0|0=gΘnΘrique rΘduit|1=gΘnΘrique complet
  23. FormatTitre=0|0|0=laisser les titres des films tels quels|1=tout en minuscules|2=tout en majuscules|3=1Φre lettre en majuscule le reste en minuscules|4=toutes les 1Φres lettres en majuscules
  24. Mode=0|0|0=mode normal|1=mode batch (url)|2=mode batch (nom + rΘalisateur)
  25.  
  26. ***************************************************)
  27.  
  28. // nΘcessite les modules suivants
  29. // StringUtils1.pas, StringUtils7552.pas et MrCinemaCinefilCommon.pas
  30.  
  31. program MonsieurCinema;
  32. uses
  33.     MrCinemaCinefilCommon;
  34.     
  35. const
  36.     MrCinemaUrl = 'http://cinema.tiscali.fr/';
  37.     MrCinemaUrlFilm = MrCinemaUrl + 'fichefilm.aspx';
  38. { recherche: films classΘs par titres (on peut aussi faire &filtre=annee)} 
  39.     MrCinemaUrlLook = MrCinemaUrl + 'recherche.aspx?file=http&filtre=titre&keys=';
  40.  
  41. var
  42.      viewstate, idhistoire, idavis, idgenerique, idanecdote, annee: string;
  43.     ImportPicture: integer;   
  44.  
  45. //------------------------------------------------------------------------------
  46. // recherche du film
  47. // MovieName = nom du film cherchΘ (tel que saisi, cad non formatΘ)
  48. //------------------------------------------------------------------------------
  49. procedure AnalyzePageMrCinema;
  50. var
  51.     Address, Page, Value, PageFilm, urlFilm: String;
  52.     pagenum, i: integer;
  53.     memo: TStringList;
  54.  
  55. begin
  56.     pagenum := 0;                                             // compteur de pages
  57. // init adresse 1Φre recherche 
  58.     Address := MrCinemaUrlLook+FormatMovieName2(MovieName); 
  59.     repeat
  60.     PageNext := '';
  61.     PagePrev := '';
  62. // traitement page courante
  63. // attention aux positionnements: les textes sont au format UTF-8
  64.     pagenum := pagenum + 1;
  65.     FormatUTF8 := 1; 
  66.     memoAdr := TStringList.Create;                          // init listes de mΘmo
  67.     memoTxt := TStringList.Create;
  68.     Page := GetPage(UrlEncode(Address));
  69.     if debug then
  70.         DumpPage(debugrep+'choixMrCinema'+IntToStr(pagenum)+'.txt', Page);    // debug
  71.     Page := TextAfter(Page, 'Vous effectuez une recherche sur');
  72.     if Page = '' then
  73.     begin
  74.         LogMessage('MrCinΘma: erreur lecture page de recherche '+IntToStr(pagenum));
  75.         memoAdr.Free;
  76.         memoTxt.Free;
  77.         exit;
  78.     end;
  79. // c'est ici qu'il faudrait mΘmoriser PagePrev/PageNext
  80. // pour l'instant il n'y en pas, mais c'est pas une raison pour ne pas le prΘvoir ...
  81.     if PagePrev <> '' then           
  82.     begin                                 
  83.         memoAdr.Add(PagePrev);
  84.         memoTxt.Add('<<< page prΘcΘdente'); 
  85.     end;
  86. // mΘmo des films de cette page (if any)
  87.     urlFilm := '<a href="' + MrCinemaUrlFilm+'?id=';
  88.     memo := TStringList.Create;
  89.     memo.Text := StringReplace(Page, '<br>', crlf);  // sΘpare lignes
  90.     for i := 0 to memo.Count-1 do            
  91.     begin 
  92.         Value := memo.GetString(i);    
  93.         PageFilm := GetUrl(Value, urlFilm, '');        // inclut &file=http
  94.         if PageFilm = '' then continue;                // pas d'url: ligne vide
  95. // 5.1: il y a maintenant une distinction entre films et DVD
  96. // fiche 'DVD' = fiche film + infos DVD supplΘmentaires
  97. // comme il n'y a plus de place pour ranger ces infos, autant ignorer ces entrΘes
  98.         if Pos('type=dvd', AnsiLowerCase(PageFilm)) > 0 then continue;
  99.         memoAdr.Add(PageFilm);
  100. // Value = nom du film, de rΘalisateur (annΘe) rq: (annΘe) facultative 
  101. // sΘparer 'nom du film' et 'rΘalisateur (annΘe)' avant HTMLRemoveTags
  102.         Value := StringReplace(Value, '</a>', sepchar1);  // aprΦs le titre
  103.         memoTxt.Add(FormatText(Value));  
  104.     end;         {for i}
  105.     memo.Free;
  106.      if PageNext <> '' then           
  107.     begin                                        
  108.         memoAdr.Add(PageNext);
  109.         memoTxt.Add('>>> page suivante'); 
  110.     end;
  111.     if memoAdr.Count = 0 then
  112.     begin
  113.         LogMessage('MrCinΘma: aucun film trouvΘ pour "'+MovieName+'"');
  114.         memoAdr.Free;
  115.         memoTxt.Free;
  116.         exit;
  117.     end;
  118.     if BatchMode > 0 then
  119.     begin                          
  120. // mode batch : recherche du meilleur poids pour les films de cette page                     
  121.         LookBest(mrcinema_id);
  122.         if (bestpoids = maxcount) or (PageNext = '') or (pagenum > pagemax) then
  123. // poids max ou pas de page next ou max pages lues: on arrete
  124.         begin     
  125.             if bestpoids > 0 then                         // on a trouvΘ quelque chose
  126.             begin 
  127.                 if bestpoids < maxcount then                         // infos partielles
  128.                         LogMessage('MrCinΘma: '+looktxt+' retenu '+besttxt+' (poids='+IntToStr(bestpoids)+')');
  129.                 AnalyzeMoviePageMrCinema(bestadr);                          // page film    
  130.             end else
  131.                 LogMessage('MrCinΘma: pas de correspondance pour '+looktxt);            
  132.             break;               // on sort
  133.         end else
  134. // sinon, on va chercher s'il y a mieux mieux dans pagenext
  135.         Address := PageNext;             
  136.     end else
  137. // mode normal
  138.     begin                                                
  139.         Address := SelectMovie('Films (Monsieur CinΘma)');
  140.         if Address <> '' then
  141.         begin
  142.             if (Address <> PageNext) and (Address <> PagePrev) then
  143.             begin
  144.                 AnalyzeMoviePageMrCinema(Address);                          // page film
  145.                 break;                                                      // on sort
  146.             end;   
  147.         end else
  148.             LogMessage('MrCinΘma: aucun film sΘlectionnΘ');             
  149.     end;
  150.     until (Address = '');
  151.     memoAdr.Free;
  152.     memoTxt.Free;
  153. end;
  154.  
  155. //------------------------------------------------------------------------------
  156. // analyse de la page du film
  157. //------------------------------------------------------------------------------
  158. procedure AnalyzeMoviePageMrCinema(Address: string);
  159.  
  160. var
  161.     Fullpage, PageEssentiel, PageHistoire, PageAvis, PageGenerique, PageAnecdote: string;
  162.     Value, Value2, titreo, titret, realisateur, producteur, duree, acteurs: string;
  163.     memo: TStringList;
  164.     i: integer;
  165.   
  166. begin
  167. // attention aux positionnements: les textes sont au format UTF-8
  168.     FormatUTF8 := 1; 
  169.     annee := '';      
  170.     Fullpage := GetPage(Address);          // charge la 1Φre page ("l'essentiel")
  171.     if debug then
  172.         DumpPage(debugrep+'filmMrCinema.txt', Fullpage);    // debug
  173.     if Pos('<b>L''essentiel</b>', Fullpage) = 0 then
  174.     Begin
  175.         LogMessage('MrCinΘma: erreur lecture page essentiel');
  176.         exit;
  177.     end;
  178.     filmok := True;                                         // τa y est, c'est bon
  179.     SetField(fieldURL, Address);
  180.     GetSubParms(Fullpage);      // rΘcupΦre les identifiants des pages secondaires
  181. // infos utiles de la page "essentiel"
  182.     PageEssentiel := TextBetween(Fullpage, '<!-- Contenu des onglets -->', '</form>'); 
  183. //********** gΘnΘrique    
  184. //*** les infos du gΘnΘrique sont plus ou moins valorisΘes
  185. //*** quant α l'annΘe, elle peut Ωtre vraiment n'importe o∙ !!!
  186. // si gΘnΘrique complet demandΘ 
  187.     if (GetOption('GΘnΘrique') = 1) and (idgenerique <> '') then
  188.     begin
  189.         PageGenerique := GetSubPage(Address, idgenerique, 'generique');
  190. // titre Original/traduit
  191.         titret := TextBetween(PageGenerique, '<b class="sous_titre">', '</b>');
  192.         titreo := TextBetween(PageGenerique, '<span class="sous_titre">', '</span>');
  193. // sΘparer les 2 tables
  194.         Value := TextBetween(PageGenerique, '<TABLE WIDTH=100%>', '</TABLE>');      // infos gΘnΘrales
  195.         acteurs := TextBetween(RemainingText, '<TABLE WIDTH=100%>', '</TABLE>');    // r⌠les/acteurs
  196. // acteurs 
  197.         acteurs := FormatTable(acteurs, 'nocont');     // ne pas recoller les lignes
  198.         acteurs := StringReplace(acteurs, sepchar2, '-');
  199. // infos gΘnΘrales
  200.         Value := FormatTable(Value, '');               // recoller les lignes
  201. // rΘalisateur (et annΘe)
  202.         realisateur := ExtractInfo(Value, 'r├⌐alis');   // rΘalisation, rΘalisateur, rΘalisΘ,...
  203.         ExtrAnnee(realisateur);
  204. // producteur (parfois c'est "rΘalisΘ et produit par machin (annΘe)" )
  205.         producteur := ExtractInfo(Value, 'produ');     // produit, production, ...
  206.         ExtrAnnee(producteur);
  207. // durΘe 
  208.         duree := ExtractInfo(Value, 'dur├⌐e');         // durΘe
  209.         duree := FormatText(TextBefore(duree, 'minutes', ''));
  210.     end;
  211. // si pas de gΘnΘrique complet ou champs non trouvΘs, on essaie dans la page 'essentiel'
  212. // titre original
  213.     if titret = '' then
  214.         titret := TextBetween(PageEssentiel, '<b class="sous_titre">', '</b>');
  215. // titre traduit (et annΘe)
  216.     Value := TextBetween(PageEssentiel, '<span class="sous_titre">', '</span>');
  217.     ExtrAnnee(Value);                           // 5.1: l'annΘe est maintenant ici
  218.     if titreo = '' then
  219.         titreo := Value;
  220. // rΘalisateur
  221.     Value := TextAfter(PageEssentiel, '<br>');
  222.     if realisateur = '' then
  223.         realisateur := TextBetween(Value, 'de', '</a>'); 
  224. // annΘe (anciennes fiches)
  225.     if annee = '' then
  226.     begin
  227.         annee := TextBetween(Value, '</a>', 'avec');
  228.         annee := TextBetween(annee, '(', ')');
  229.     end;
  230. // acteurs
  231.     if acteurs = '' then 
  232.     begin
  233.         acteurs := TextBetween(Value, 'avec', '<div');
  234.         acteurs := StringReplace(acteurs, ', ...', '');   // je ne sais pas si τa existe encore
  235.     end;
  236. // (pas d'info 'producteur' dans la page 'essentiel')
  237. //********** mise α jour des champs du gΘnΘrique
  238. // titre original et traduit
  239.     titret := FormatText(titret);                     // titre traduit ou original
  240.     titreo := StringReplace(titreo, '(', '');
  241.     titreo := StringReplace(titreo, ')', '');
  242.     titreo := FormatText(titreo);                     // original ou ''
  243.     titret := TranslateText(titret, FormatTitre);
  244.     titreo := TranslateText(titreo, FormatTitre);
  245.     if (titreo = '') or (titreo = titret) then             // 1er titre = original
  246.     begin                                         
  247.         SetField(fieldOriginalTitle, titret);
  248.         SetField(fieldTranslatedTitle, '');   
  249.     end else
  250.     begin                                                  // traduit + original
  251.         SetField(fieldOriginalTitle, titreo); 
  252.         SetField(fieldTranslatedTitle, titret);  
  253.     end;
  254.     SetField(fieldDirector, FormatText(realisateur));      // rΘalisateur  
  255.     SetField(fieldYear, FormatText(annee));                // annΘe
  256.     SetField(fieldProducer, FormatText(producteur));       // producteur
  257.     SetField(fieldActors, FormatText(acteurs));            // acteurs
  258. // durΘe: SetField fait plus tard
  259. //********** Description (rΘsumΘ ou histoire complΦte)
  260.     Value := TextBetween(PageEssentiel, '<div align="justify">', '</div>');     // rΘsumΘ
  261.     if (idhistoire <> '') and ((Value = '') or (GetOption('Histoire') = 1) or (Pos('>Lire la suite<', Value) > 0)) then  
  262.     begin    // 5.1 pas de rΘsumΘ ou dΘbut de histoire complΦte ou histoire complΦte demandΘe
  263.         PageHistoire := GetSubPage(Address, idhistoire, 'histoire');
  264.         Value := TextBetween(PageHistoire, '<div align="justify">', '</div>');
  265.     end;
  266.     SetField(fieldDescription, FormatText(Value));
  267. //********** avis de la rΘdaction, note (peuvent Ωtre dans la page "essentiel") + anecdote
  268.     Value := '';
  269.     PageAvis := TextAfter(Fullpage, '<b>L''avis de la r├⌐daction</b>' );
  270.     if (PageAvis = '') and (idavis <> '') then                        // avis sur autre page 
  271.         PageAvis := GetSubPage(Address, idavis, 'avis');
  272.     Value := FormatText(TextBetween(PageAvis, '<div align="justify"><p>', '</div>'));  
  273. // Value = avis de la rΘdaction: garder pour complΘter avec l'anecdote
  274.     Value2 := TextBetween(PageAvis, '<img src="img/', 'redac.gif"');   // note 0 α 9 ou ''
  275.     if (Pos('<b>Aucun avis de la redaction.</b>', PageAvis) > 0) and (Value2 = '0') then
  276.         Value2 := '';                         // pas d'avis et img = 0redac.gif alors ignorer
  277.     if Value2 <> '' then                    
  278.         Value2 := IntToStr(StrToInt(Value2, 0) * 2);                   // note = 2 * x                              
  279.     SetField(fieldRating, Value2);  
  280. // on ajoute l'anecdote si demandΘ et existant
  281.     if (GetOption('Anecdote') = 1) and (idanecdote <> '') then
  282.     begin
  283.         PageAnecdote := GetSubPage(Address, idanecdote, 'anecdote');
  284.         Value2 := FormatText(TextBetween(PageAnecdote, '<div align="justify">', '</div>'));
  285.         if Value2 <> '' then
  286.         begin
  287.             if Value <> '' then Value := Value + crlf + crlf;
  288.             Value := Value + 'Anecdote' + crlf + Value2;
  289.         end;
  290.     end;
  291.     SetField(fieldComments, Value);
  292. //********** hors zone dynamique 
  293. // 5.2 changement de certains tags 
  294.     Value2 := TextBetween(Fullpage, '<table cellpadding="0" cellspacing="0" border="0" class="boite_arrondie" style="background-color: #e5e5e5; special;" width="423" height="180">', '</table>');
  295. // genre
  296.     Value := FormatText(TextBetween(Value2, '<b>Genre</b></div>', '</div>'));
  297.     SetField(fieldCategory, Value);
  298. // durΘe (sauf si dΘjα fait)
  299.     if duree = '' then
  300.     begin                    // format hh:mm:ss α transformer en minutes
  301.         duree := FormatText(TextBetween(Value2, '<b>Dur├⌐e</b></div>', '</div>'));            
  302.         if duree <> '' then              // format hh:mm:ss
  303.             duree := IntToStr(StrToInt(Left(duree, 2), 0) * 60 + StrToInt(Copy(duree, 4, 2), 0));
  304.     end;
  305.     SetField(fieldLength, duree);                           // on range maintenant
  306. // pays
  307.     Value := FormatText(TextBetween(Value2, '<b>Pays </b></div>', '</span>'));
  308.     if Value <> '' then
  309.     begin                       // pas toujours trΦs cohΘrents les noms de pays...
  310.         Value := StringReplace(Value, '.', '');
  311.         Value := StringReplace(Value, ',', '');
  312.         Value := StringReplace(Value, '/', ' ');
  313.         Value := StringReplace(Value, '-' ,' ');
  314.         Value := CompactString(Value, '');
  315.         Value := TranslateText(Value, 4);
  316.         Value := StringReplace(Value, 'Usa', 'Etats-Unis');
  317.         Value := StringReplace(Value, 'Etats Unis', 'Etats-Unis');
  318.         Value := StringReplace(Value, 'Grande Bretagne', 'Grande-Bretagne');
  319.         Value := StringReplace(Value, 'Nouvelle ZΘlande', 'Nouvelle-ZΘlande');
  320. // tri
  321.         memo := TStringList.Create;
  322.         memo.Text := StringReplace(Value, ' ', crlf);
  323.         SortList(memo);
  324.         Value := Trim(StringReplace(memo.Text, crlf, ' '));
  325.         memo.Free;
  326.     end;
  327.     SetField(fieldCountry, Value);
  328. //********** image si demandΘe (rappel: ImportPicture = 0 si not CanSetPicture)
  329.     if (ImportPicture = 1) or (ImportPicture = 3) then
  330.     begin
  331.         Value := TextBetween(Value2, '<img src="', '"');
  332.         if Value <> '' then GetPicture(Value);
  333.     end;
  334. end;
  335.  
  336. //------------------------------------------------------------------------------
  337. // extraction de l'annΘe dans une chaine (texte_α_garder (annΘe) )
  338. //------------------------------------------------------------------------------
  339. procedure ExtrAnnee(var str: string);
  340. var
  341.     i: integer;
  342.     
  343. begin
  344.     i := LastPos('(1', str);              // (1xxx ou (2xxx τa devrait suffire !!!
  345.     if i = 0 then
  346.         i := LastPos('(2', str);
  347.     if i > 0 then                                  // annΘe trouvΘe 
  348.     begin
  349.         if annee = '' then
  350.             annee := Copy(str, i+1, 4);
  351.         str := Left(str, i -1);                      // chaine initiale sans l'annΘe
  352.     end;
  353. end;
  354.  
  355. //------------------------------------------------------------------------------
  356. // formatage du nom du film 
  357. //------------------------------------------------------------------------------
  358. function FormatMovieName2(str: string) :string;
  359. var
  360.     i, j: integer;
  361.     
  362. begin
  363. // une petite Θdition avant de formater           
  364.     str := StringReplace(str, ' & ', ' et ');
  365.     str := StringReplace(str, ' & ', ' et ');
  366. // MrCinΘma traite bizarrement SES titres s'ils contiennent une virgule ou deux points 
  367. // exemple "2001 l'odyssΘe de l'espace" connu sous "2001 : l'odyssΘe de l'espace"
  368. // il faut rentrer soit "2001" , soit "l'odyssee de l'espace" 
  369. // mais pas les 2 (il ne rend rien dans ce cas: oui, c'est bien bizarre...)
  370. // donc on s'arrΩte aussi au premier de ces caractΦres (mais τa rΦgle pas tout)
  371.     i := Pos(',', str);
  372.     j := Pos(':', str);
  373.     if (i <> 0) or (j <> 0) then           // au moins 1 de trouvΘ
  374.     begin
  375.         if i = 0 then 
  376.             i := j
  377.         else
  378.         begin
  379.             if (j <> 0) and (i > j) then i := j;
  380.         end;
  381.         str := Left(str, i -1);
  382.     end; 
  383.     result := FormatMovieName(str);     
  384. end;
  385.  
  386. //------------------------------------------------------------------------------
  387. // formatage d'une table (gΘnΘrique)
  388. //------------------------------------------------------------------------------
  389. function FormatTable(str1, flag: string) :string;
  390. var
  391.     sepcel: string;
  392.     
  393. begin
  394. // structure table
  395. // <TR ...>                      = dΘbut de ligne
  396. //   <TD ...> texte </TD>        = 1 cellule
  397. //   ....................          autres cellules
  398. // </TR>                         = fin de ligne
  399.     str1 := StringReplace(str1, crlf, '');              // supprimer les crlf
  400.     str1 := StringReplace(str1, '<TR', crlf+'<');       // dΘbut de ligne = crlf
  401.     str1 := StringReplace(str1, '<TD>', sepchar2);      // cellule du 'milieu'
  402.     str1 := StringReplace(str1, '<TD ', sepchar1+'<');  // 1Φre cellule
  403.     HTMLRemoveTags(str1);                               // supprimer les autres tags
  404.     str1 := StringReplace(str1, sepchar1+crlf, '');     // supprimer les lignes vides
  405. // dΘterminer le 1er sΘparateur de cellule (plusieurs sortes de coding...)
  406. // crlf+sepchar1          = <TD ...>texte
  407. // crlf+sepchar1+sepchar2 = <TR><TD ...></TD><TD>texte
  408. // et le remplacer par crlf (α priori seuls cas possibles)
  409.     sepcel := crlf+sepchar1+sepchar2;
  410.     if Pos(sepcel, str1) <> 1 then sepcel := crlf+sepchar1;
  411.     str1 := StringReplace(str1, sepcel, crlf);
  412. // s'il reste des crlf+sepchar2+sepchar2 ou crlf+sepchar2, il s'agit de continuations de lignes
  413. // recoller les lignes si demandΘ
  414.     if flag = 'nocont' then
  415.         sepcel := crlf                   // on recolle pas 
  416.     else
  417.         sepcel := ' ';                   // 1 blanc pour ne pas coller au prΘcΘdent     
  418.     str1 := StringReplace(str1, crlf+sepchar2+sepchar2, sepcel);     
  419.     str1 := StringReplace(str1, crlf+sepchar2, sepcel);
  420. //
  421.     str1 := StringReplace(str1, sepchar2+sepchar2, sepchar2);        // supprimer les cellules vides        
  422.     str1 := StringReplace(str1, sepchar2+sepchar2, sepchar2);        // oui, c'est voulu
  423.     str1 := StringReplace(str1, sepchar2, ' '+sepchar2+' ');         // decoller les sΘparateurs du texte
  424.     str1 := StringReplace(str1, sepchar1, '');                       // et celui qui reste
  425.     result := str1;                          // suite du formatage dans FormatText
  426. end; 
  427.         
  428. //------------------------------------------------------------------------------
  429. // extraction des infos des tables MrCinΘma
  430. //------------------------------------------------------------------------------
  431. Function ExtractInfo(str1, from: string) :string;
  432. var
  433.     i: integer;
  434.  
  435. begin
  436. // si pas de sΘparateur de champs (sepchar2), alors on prend le mot suivant (anciennes dΘfinitions)
  437. // d'o∙ la recherche sur des mots 'incomplets' (et en plus, τa permet de couvrir plus de cas...)
  438. // rappel: le mot cherchΘ (from) peut contenir des majuscules
  439.         result := '';
  440.         i := Pos(AnsiLowerCase(from), AnsiLowerCase(str1));
  441.         if i = 0 then exit;                                       // from non trouvΘ
  442.         str1 := Copy(str1, i + Length(from), Length(str1));
  443.         i := Pos(crlf, str1);
  444.         if i > 0 then                                // si pas de crlf, prendre tout
  445.             str1 := Left(str1, i-1);
  446.         i := Pos(sepchar2, str1);
  447.         if i = 0 then    i := Pos(' ', str1); 
  448.         result := Copy(str1, i +1, length(str1));
  449. end;
  450.  
  451. //------------------------------------------------------------------------------
  452. // rΘcupΘration des identifiants 'sous-pages'
  453. // GetSubParms(page) 
  454. //------------------------------------------------------------------------------
  455. procedure GetSubParms(s: string);
  456. var 
  457.     Value: string;
  458.     i: integer;
  459.         
  460. begin
  461. // infos utiles
  462. // 5.2 les url ont la bougeotte donc ne pas prΘ-dΘterminer l'ordre
  463.     Value := TextBetween(s, '<b>L''essentiel</b>', '<!-- Contenu des onglets -->');
  464.     if Pos('doPostBack', Value) > 0 then
  465.     begin                                              
  466. // formulaire et PostPage (ancienne mΘthode)
  467. // α garder tant que la fonction doPostBack est dΘfinie dans la page (on ne sait jamais...)
  468. // rΘcupΦre le paramΦtre VIEWSTATE (ident de session)
  469.         viewstate := TextBetween(s, 'name="__VIEWSTATE"', '/>');
  470.         viewstate := TextBetween(viewstate, 'value="', '"');
  471. // c'est un peu trop cablΘ: ordre et __EVENTARGUMENT='': serait mieux si c'Θtait plus prΘcis
  472. // page histoire
  473.         idhistoire := TextBetween(Value, '__doPostBack(''', '''');
  474.         Value := RemainingText;
  475.         if idhistoire <> '' then
  476.         begin
  477.             idhistoire := StringReplace(idhistoire, '$', ':');
  478.             idhistoire := '__EVENTTARGET='+ idhistoire + '&__EVENTARGUMENT=&__VIEWSTATE=' + viewstate;
  479.         end;
  480. // page avis de la rΘdaction
  481.         idavis := TextBetween(Value, '__doPostBack(''', '''');
  482.         Value := RemainingText;
  483.         if idavis <> '' then
  484.         begin
  485.             idavis := StringReplace(idavis, '$', ':');
  486.             idavis := '__EVENTTARGET='+ idavis + '&__EVENTARGUMENT=&__VIEWSTATE=' + viewstate;
  487.         end;
  488. // page gΘnΘrique
  489.         idgenerique := TextBetween(Value, '__doPostBack(''', '''');
  490.         Value := RemainingText;
  491.         if idgenerique <> '' then
  492.         begin
  493.             idgenerique := StringReplace(idgenerique, '$', ':');
  494.             idgenerique := '__EVENTTARGET='+ idgenerique + '&__EVENTARGUMENT=&__VIEWSTATE=' + viewstate;
  495.         end;
  496. // page anecdote
  497.         idanecdote := TextBetween(Value, '__doPostBack(''', '''');
  498.         if idanecdote <> '' then 
  499.         begin
  500.             idanecdote := StringReplace(idanecdote, '$', ':');
  501.             idanecdote := '__EVENTTARGET='+ idanecdote + '&__EVENTARGUMENT=&__VIEWSTATE=' + viewstate;
  502.         end;
  503.     end
  504.     else
  505.     begin                                                       
  506. // url normale (mΘthode actuelle)
  507. // page histoire
  508.         idhistoire := GetUrlPage(Value, '>L''histoire</a>');
  509. // page avis de la rΘdaction
  510.         idavis := GetUrlPage(Value,'>L''avis de la r├⌐daction</a>');
  511. // page gΘnΘrique
  512.         idgenerique := GetUrlPage(Value,'>Le g├⌐n├⌐rique complet</a>');
  513. // page anecdote
  514.         idanecdote := GetUrlPage(Value,'>L''anecdote</a>');
  515.     end;
  516. // si certains champs ne doivent pas Ωtre valorisΘs, inutile de lire les pages supplΘmentaires
  517.     if not CanSetField(fieldDescription) then    idhistoire := '';
  518.     if not CanSetField(fieldComments) then idanecdote := '';
  519.     if not CanSetField(fieldComments) and (not CanSetField(fieldRating)) then idavis := '';
  520. // pour gΘnΘrique complet
  521. // il faut tester 'not' pour acteurs et rΘalisateur et producteur et durΘe et annΘe
  522.     Value := '';
  523.     if CanSetField(fieldActors) then Value := 'ok';
  524.     if CanSetField(fieldDirector) then Value := 'ok';
  525.     if CanSetField(fieldProducer) then Value := 'ok';
  526.     if CanSetField(fieldLength) then Value := 'ok';
  527.     if CanSetField(fieldYear) then Value := 'ok';
  528.     if Value = '' then idgenerique := '';
  529. end;
  530.  
  531. //------------------------------------------------------------------------------
  532. // rΘcupΘration de l'url d'une sous-page
  533. // url := GetUrlPage(texte_contenant_l'url, texte_α_chercher) 
  534. //------------------------------------------------------------------------------
  535. function GetUrlPage(wholetext, str: string) : string;
  536. var 
  537.     id: string;
  538.     i: integer;
  539.         
  540. begin
  541. // l'url est avant le texte cherchΘ
  542.     i := Pos(str, wholetext);
  543.     id := left(wholetext, i + length(str));
  544. // et aprΦs le dernier '<a ' 
  545.     i := LastPos('<a ', AnsiLowerCase(id));
  546.     result := GetUrl(Copy(id, i, length(id)), '', MrCinemaUrlFilm);
  547. end;
  548.  
  549. //------------------------------------------------------------------------------
  550. // rΘcupΘration des sous-pages 
  551. // pagexxx := GetSubPage(adresse_fiche_film, ident_page_cherchΘe, nom_fichier_pour_debug) 
  552. //------------------------------------------------------------------------------
  553. function GetSubPage(Address, idpage, idfic: string) :string;
  554. var
  555.     page: string;
  556.     
  557. begin
  558.     idpage := UrlEncode(idpage);
  559.     if viewstate = '' then
  560. // page 'normale' (getpage)
  561.         page := GetPage(idpage)
  562.     else
  563.     begin
  564. // formulaire et PostPage
  565. // encore des caractΦres α transformer... aprΦs UrlEncode (ordre trΦs important)
  566.         idpage := StringReplace(idpage, '+', '%2B'); 
  567.         idpage := StringReplace(idpage, ':', '%3A');
  568.         page := PostPage(Address,idpage);
  569.     end;
  570.     if debug then
  571.         DumpPage(debugrep+idfic+'MrCinema.txt', page);    // debug
  572.     if page = '' then
  573.     Begin
  574.         LogMessage('MrCinΘma: erreur lecture page '+idfic);
  575.         exit;
  576.     end;
  577. // ne garder que la partie dynamique
  578.     result := TextBetween(page, '<!-- Contenu des onglets -->', '</form>');
  579. end;
  580.     
  581. //------------------------------------------------------------------------------
  582. // traitement mode batch
  583. //------------------------------------------------------------------------------
  584. procedure MrCinemaBatch;
  585. begin
  586.     SetField(fieldChecked, '');                         // init film en traitement
  587.     case BatchMode of
  588.     1:
  589.         begin
  590. // recherche par url
  591.             MovieName := GetField(fieldUrl);       // pas d'url ou autre site, ignorer
  592.             if (MovieName <> '') and (Pos(MrCinemaUrlFilm, MovieName) > 0) then
  593.                 AnalyzeMoviePageMrCinema(MovieName)
  594.             else
  595.                 LogMessage('MrCinΘma: non traitΘe url="'+Moviename+'"');
  596.         end;
  597.     2:
  598.         begin
  599. // recherche par nom    + rΘalisateur
  600.             MovieName := GetMovieName;
  601.             if MovieName <> '' then    
  602.             begin
  603.                 initBatchLook;                           // init paramΦtres de recherche         
  604.                 AnalyzePageMrCinema;
  605.             end else
  606.                 LogMessage('MrCinΘma: non traitΘe (pas de nom de film)');    
  607.         end;
  608.     end;      {case}             
  609.     if filmok then
  610.     begin
  611.         SetField(fieldChecked, 'x');                                      // film ok
  612.         if ((ImportPicture = 2) or (ImportPicture = 3)) then
  613.         begin
  614. // ok pour MrCinΘma: rechercher l'affiche CinΘfil 
  615. // (forcΘment par nom + rΘalisateur tant qu'il n'y a pas de 2Φme champ url)
  616.             MovieName := GetMovieName;         // relecture
  617.             if MovieName <> '' then
  618.             begin
  619.                 initBatchLook;
  620.                 AnalyzePageCinefil; 
  621.             end;
  622.         end;         {import picture}
  623.     end;           {filmok}
  624. end;
  625.  
  626. //------------------------------------------------------------------------------
  627. // traitement mode normal
  628. //------------------------------------------------------------------------------
  629. procedure MrCinemaNorm;
  630. var
  631.     mname: string; // Input ne peut pas accΘder aux variables dΘclarΘes dans les units
  632.  
  633. begin
  634. // Monsieur cinΘma 
  635.     mname := GetMovieName;
  636.     msgano := 'Entrez le titre du film';
  637.     repeat
  638.     if not Input('MonsieurCinΘma.com Import', msgano, mname) or (mname = '') then exit;
  639.     MovieName := mname;
  640.     AnalyzePageMrCinema;
  641.     until filmok;
  642. // CinΘfil (si image demandΘe)
  643.     if (ImportPicture = 2) or (ImportPicture = 3) then
  644.     begin                                   
  645.         MovieName := GetMovieName;         // relecture
  646.         filmok := False;
  647.         msgano := 'Entrez le titre du film';
  648.         repeat
  649.         AnalyzePageCinefil;        
  650.         if not filmok then 
  651.         begin                           // page non trouvΘe ou erreur: on y retourne
  652.             mname := MovieName;
  653.             if not Input('CinΘfil.com Import', msgano, mname) or (mname = '') then
  654.                 exit;                                             // non saisie: on sort
  655.             MovieName := mname;       
  656.         end;     
  657.         until filmok;
  658.     end;      {import picture}       
  659. end;
  660.  
  661. //------------------------------------------------------------------------------
  662. //  c'est ici que τa commence  
  663. //------------------------------------------------------------------------------                                                
  664. begin
  665.     if abort = 'o' then exit;                           // mode batch non confirmΘ
  666.     if firstcall <> 'done' then
  667.     begin                                            // 1er appel: init paramΦtres
  668.         firstcall := 'done';
  669.         if not CheckVersion(3,5,0) then
  670.         begin
  671.             ShowMessage('Ce script requiert une version plus rΘcente de Ant Movie Catalog (au moins la version 3.5.0)');
  672.             abort := 'o';
  673.             exit;
  674.         end;                
  675.         calledBy := mrcinema_id;                             // identifiant appelant
  676.         batchlogfic := 'c:\amc_MrCinema_batchlog.txt';       // log pour mode batch
  677.         debug := False;                       // mode debug on/off 
  678.         debugrep := 'd:\temp\';               // rΘpertoire de stockage des fichiers
  679. // rΘcupΦre les variables user (utilisΘes plus d'une fois)
  680.         BatchMode := GetOption('Mode');
  681.         FormatTitre := GetOption('FormatTitre');
  682.         ImportPicture := GetOption('Image');
  683.         if not CanSetPicture then
  684.             ImportPicture := 0;         // champ image non modifiable: inutile de lire
  685. //
  686.         if BatchMode > 0 then                      // mode batch: confirmer le choix
  687.         begin
  688.             initBatchLog;                            // init log
  689.             if not ShowWarning(confbatch.Text) then
  690.             begin
  691.                 AddToLog('mode batch annulΘ'); 
  692.                 abort := 'o';
  693.                 exit;
  694.             end;
  695.         end;
  696.     end;
  697. // c'est parti
  698.     filmok := False;
  699.     if BatchMode = 0 then
  700.         MrCinemaNorm
  701.     else
  702.         MrCinemaBatch;        
  703. end.
  704.